/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package digitrencer;


/**
 * A kompozit elem lábait megvalósító osztály.
 * @author taplonaplo
 */
public class Tag extends Element{
        private int pin;

        /**
         * Konstruktor, meghívja az Element osztály konstruktorát, majd a pin
         * mezőt -1-be inicializálja.
         * @param inputs    Bemeneti vezetékek
         * @param outputs   Kimeneti vezetékek
         */
        Tag(Wire[] inputs, Wire[] outputs){
            super(inputs,outputs);
            pin = -1;
        }

        /**
         * Tag bemeneti vezetékének beállítása. Létrehozási időben csak elemen
         * belüli vezetékekt látunk, ezért a kivülről csatlakozókat késöbb kell
         * beállítani.
         * @param input A külső vezeték.
         * @throws IllegalArgumentException Ha már be van állítva a bemenet.
         */
        public void setInput(Wire input) throws IllegalArgumentException{
            if (in.length == 0){
                in = new Wire[1];
                in[0] = input;
            }
            else throw new IllegalArgumentException("A bemeneti lábon már van vezeték.");
        }

        /**
         * Tag kimeneti vezetékének beállítása. Létrehozási időben csak elemen
         * belüli vezetékekt látunk, ezért a kivülről csatlakozókat késöbb kell
         * beállítani.
         * @param output A külső vezeték.
         * @throws IllegalArgumentException Ha már be van állítva a kimenet
         */
        public void setOutput(Wire output) throws IllegalArgumentException{
            if (out.length == 0){
                if (output.getHasInput()) {
                    throw new IllegalArgumentException("Egy vezetéknek nem lehet több alkatrész a bementére kötve!");
                } else output.setHasInput(true);
                out = new Wire[1];
                out[0] = output;
            }
            else throw new IllegalArgumentException("A kimeneti lábon már van vezeték.");
        }

        /**
         * A pin paraméter lekérdezési metódusa.
         * @return a láb sorszáma.
         */
        public int getPin(){
            if (this.pin != -1){
                return pin;
            }
            else throw new IllegalArgumentException("A láb nem kapott azonosítót.");

        }

        /**
         * Metódus a pin paraméter meghatározására.
         * @param pin A láb sorszáma a kompozit elemben
         * @throws IllegalArgumentException Amennyiben ahhoz a lábhoz már rendeltünk tag-et.
         */
        public void setPin(int pin) throws IllegalArgumentException{
            if (this.pin == -1){
                this.pin = pin;
            }
            else throw new IllegalArgumentException("A láb már kapott azonosítót.");
        }

        /**
         * Tag futási metódusa. A bementi vezeték értékét továbbítja a kimeneti
         * vezetékre.
         */
    @Override
        public void run(){
            out[0].setStart(in[0].getEnd());
        }
}
